Description |
---|
Transforme les arêtes sélectionnées si possible en un Arc circulaire. Utile pour restaurer des arcs discrétisés. Version macro : 1.0 Date dernière modification : 2014-01-02 Version FreeCAD : Toutes versions Téléchargement : Icône pour votre barre d'outils Auteur: Jreinhardt |
Auteur |
Jreinhardt |
Téléchargement |
Icône pour votre barre d'outils |
Liens |
Page des macros Comment installer une macro Comment créer une barre d'outils |
Version Macro |
1.0 |
Dernière modification |
2014-01-02 |
Version(s) FreeCAD |
Toutes versions |
Raccourci clavier |
None |
Voir aussi |
Macro SuperWire |
Parfois, on rencontre des fils qui contiennent des arcs composés de petits segments de droites. Cela se produit souvent lorsque vous travaillez avec des fichiers provenant d'autres programmes. Cette macro permet de reconvertir relativement facilement ces arcs "discrétisés" en arcs circulaires. Cela réduit la taille du fichier et rend sa gestion plus facile.
Pour utiliser cette macro, vous devez briser le fil en bords individuels à l'aide de la fonction Draft Downgrade. Ensuite il suffit de sélectionner les segments que vous voulez convertir en arc circulaire et exécuter la macro. Vous avez besoin d'au moins deux segments pour exécuter la fonction.
La macro va vérifier si les segments se situent tous sur un cercle commun (segments contigus) et s'arrêtera si ce n'est pas le cas. Sinon, un arc sera créé et les segments enlevés.
En raison de petites erreurs dans les calculs, de la fonction Draft Upgrade la macro peut parfois ne pas de reconstituer toutes les arêtes et arcs. Dans ce cas, la macro Macro_SuperWire offre un moyen plus robuste pour le faire.
Macro_EdgesToArc.FCMacro
import Draft import FreeCADGui, FreeCAD from FreeCAD import Base, Console from math import atan2, pi, fabs #This macro replaces a number of edges approximating a circular arc by a proper circular arc. #It might be necessary to use the superwire macro to recombine the edges back to a wire, because of small errors in the calculations. sel = FreeCADGui.Selection.getSelection() if len(sel) < 2: Console.PrintError("Too few edges are selected\n") edges = [s.Shape for s in sel] start_vertices = [] end_vertices = [] for edge in edges: start_vertices.append(edge.Vertexes[0].Point) end_vertices.append(edge.Vertexes[1].Point) vertices = start_vertices + end_vertices start,end,middle = None,None,None #find start and end points for edge in edges: is_start = True is_end = True for point in end_vertices: if edge.Vertexes[0].Point.distanceToPoint(point) < 1e-8: is_start = False for point in start_vertices: if edge.Vertexes[1].Point.distanceToPoint(point) < 1e-8: is_end = False if is_start: start = edge.Vertexes[0].Point if is_end: end = edge.Vertexes[1].Point #find middle point, at least not too far away from the middle for v in vertices: ratio = v.distanceToPoint(start)/v.distanceToPoint(end) if ratio > 0.5 and ratio < 2.: middle = v break if middle is None: Console.PrintError("Could not find suitable middle point\n") arc = Part.ArcOfCircle(start,middle,end) #Check circularity circular = True for v in vertices: if fabs(v.distanceToPoint(arc.Center) - arc.Radius) > 1e-6: Console.PrintError("Edges do not approximate a circular arc\n") circular = False break if circular: Part.show(arc.toShape()) for shape in sel: FreeCAD.ActiveDocument.removeObject(shape.Name)